package fichiers;

import espace_physique.*;
import java.io.*;
import java.util.*;
import support.*;


public class Dossier extends Element{
    
    private boolean verification;
    private ArrayList elements;
    
    public Dossier(Dossier pere,File courant,String nom) {
        super(pere,courant,nom);
        this.elements=new ArrayList();
        this.verification=false;
    }
    
    
    public void constructionSousDossier(){
        
        //Creation des sous dossiers
        File ensFichier[]=this.getFichierCourant().listFiles();
        if(ensFichier!=null &&ensFichier.length>0){
            
            for(int i=0;i<ensFichier.length;i++){
                
                if(ensFichier[i].isDirectory()){
                    Dossier temp=new Dossier(this,ensFichier[i],ensFichier[i].getName());
                    this.ajouterSousElement(temp);
                    temp.constructionSousDossier();
                }
                
            }
            
        }
    }
    
    
    public void ajouterPhotos(){
        
        //Creation des sous dossiers
        File ensFichier[]=this.getFichierCourant().listFiles();
        if(ensFichier!=null &&ensFichier.length>0){
            
            for(int i=0;i<ensFichier.length;i++){
                
                if(Options.estUneImage(ensFichier[i])){
                    Image temp=new Image(this,ensFichier[i],ensFichier[i].getName());
                    this.ajouterSousElement(temp);
                    
                }
            }
            
        }
    }
    
    public void creerCopieRecursive(Dossier aCopie,boolean avecPhoto){
        
        ArrayList pere=aCopie.getDossiers();
        this.setModel(aCopie);
        aCopie.ajouterVue(this);
                        //System.out.println()
        for(int i=0;i<pere.size();i++){
            
            Element filsACopie=(Element)pere.get(i);
            if(filsACopie.estUnDossier()){
                Dossier d=new Dossier(this,filsACopie.getFichierCourant(),filsACopie.toString());
                this.ajouterSousElement(d);
                d.creerCopieRecursive((Dossier) filsACopie, avecPhoto);
                
            } else{
                
                Image d=new Image(this,filsACopie.getFichierCourant(),filsACopie.toString());
                this.ajouterSousElement(d);
            }
        }
        if(avecPhoto){
            this.ajouterPhotos();
        }
    }
    
    public boolean getVerification(){
        
        return this.verification;
    }
    
    public  void setVerification(boolean resultat) {
        
        
        this.setVerificationRecursif(resultat);
        ThreadVerification threadV=new ThreadVerification(this);
        threadV.start();
        
    }
    
    private void setVerificationRecursif(boolean verif){
        this.verification=verif;
        this.prevenirVueModificationVerification(this);
        
        if(this.elements.size()!=0){
            
            Iterator<Element> i=this.elements.iterator();
            while(i.hasNext()){
                
                Element temp=i.next();
                ((Dossier)temp).setVerificationRecursif(verification);
            }
            
        }
    }
    
    public ArrayList getDossiers(){
        
        return this.elements;
    }
    
    public void ajouterSousElement(Element e){
        
        this.elements.add(e);
        this.prevenirVueAjout(e);
    }
    
    public void ajouterSousElement(Element e,int index){
        
        this.elements.add(index,e);
        this.prevenirVueAjout(e);
    }
    
    
    public void supprimerSousElement(Element e){
        
        this.elements.remove(e);
        e.prevenirVueSuppression(e);
    }
    
    public int getIndex(Element e){
        
        int index=0;
        Iterator it=this.elements.iterator();
        while(it.hasNext()){
            
            Element suiv=(Element) it.next();
            if((suiv.toString()).compareToIgnoreCase(e.toString())<0){
                
                index++;
            }
        }
        return index;
    }
    
    public boolean estUnDossier(){
        
        return true;
    }
}


class ThreadVerification extends Thread{
    
    private Dossier d;
    
    public ThreadVerification(Dossier d){
        
        this.d=d;
    }
    
    public void run(){
        
        RacineDossier.getRacine().getGestionnaire().mettreAJour(d);
    }
}
